define(function(require, exports){
	var $ = require('jquery');
	var pubjs = require('pubjs');
	var util  = require('util');
	var view  = require('@base/view');

	// 废弃，请使用@base/common/drop.add

	/**
	 * Input类
	 */
	var Base = view.widget.extend({
		init: function(config){
			config = pubjs.conf(config, {
				'layout': {
					'tag': 'span',
					'class': 'M-commonInput'
				},
				'class': '',
				'tag': 'input',
				'type': 'button',
				'attr': null,
				'css': null,
				'width': 0,
				'height': 0,
				'value': LANG('按钮'),
				'events': 'click'
			});

			this.Super('init', arguments);
		},
		afterBuild: function(layout){
			var self = this;
			var c = self.getConfig();
			var input = self.$input = $('<'+c.tag+' />');

			// 设置属性
			if (c.attr){
				input.attr(c.attr);
			}
			input.attr('type', c.type);

			// 设置CSS和尺寸
			if (c.css){
				input.css(c.css);
			}
			if (c.width){
				input.width(c.width);
			}
			if (c.height){
				input.height(c.height);
			}

			// 设置样式
			var cls = c['class'] || [];
			if (!util.isArray(cls)){
				cls = [cls];
			}
			if (c.type == 'button'){
				// cls.push('btn');
			}
			if (cls.length){
				input.addClass(cls.join(' '));
			}

			// 插入对象到目标对象
			if (layout){
				self.append(input);
			}else {
				self.$el = input;
				self.appendTo(c.target);
			}

			// 绑定事件
			if (c.events){
				self.uiBind(input, c.events, 'eventHandler');
			}

			if (c.value){
				self.setValue(c.value);
			}
		},
		// 事件转发
		// onInputClick ..
		eventHandler: function(evt, elm){
			var self = this;
			self.fire('input' + util.ucFirst(evt.type),{
				'value': self.getValue(),
				'target': elm
			});
		},
		setValue: function(value){
			this.$input.val(value);
			return this;
		},
		getValue: function(){
			return this.$input.val();
		},
		// 转发操作
		click: function(){
			var el = this.$input;
			el.click.apply(el, arguments);
			return this;
		},
		blur: function(){
			var el = this.$input;
			el.blur.apply(el, arguments);
			return this;
		},
		focus: function(){
			var el = this.$input;
			el.focus.apply(el, arguments);
			return this;
		},
		enable: function(){
			this.$input.prop('disabled', false);
			return this;
		},
		disable: function(){
			this.$input.prop('disabled', true);
			return this;
		}
	});
	exports.base = Base;


	// 添加按钮；鼠标经过显示文字
	var Add = Base.extend({
		init: function(config){
			config = pubjs.conf(config, {
				'layout': {
					'tag': 'span'
					// 'class': 'M-commonButtonSmall'
				},
				'menu': null, // 下拉数据
				'class': 'M-buttonAdd',
				'tag': 'span',
				'attr': null,
				'css': null,
				'width': 0,
				'height': 0,
				'value': LANG('按钮'),
				'events': 'click',
				'text': '',
				'openNewpage': false
			});

			this.Super('init', arguments);
		},
		afterBuild: function(layout){
			var self = this;
			var c = self.getConfig();
			var dom = $('<span/>');

			var input = self.$input = $('<'+c.tag+' class="vAlign_m"><i class="uk-icon-plus"/></'+c.tag+'>').appendTo(dom);

			// 设置属性
			if (c.attr){
				input.attr(c.attr);
			}

			// 设置CSS和尺寸
			if (c.css){
				input.css(c.css);
			}
			if (c.width){
				input.width(c.width);
			}
			if (c.height){
				input.height(c.height);
			}

			// 设置样式
			var cls = c['class'] || [];
			if (!util.isArray(cls)){
				cls = [cls];
			}
			if (cls.length){
				input.addClass(cls.join(' '));
			}

			// 插入对象到目标对象
			if (layout){
				self.append(dom);
			}else {
				self.$el = input;
				dom.appendTo(c.target);
			}

			// 绑定事件
			if (c.events){
				self.uiBind(input, c.events, 'eventHandler');
			}

			if(c.text){
				this.$text = $('<span class="ml5 M-buttonText vAlign_m"/>').text(c.text).appendTo(dom);
				self.uiBind(dom, 'mouseenter mouseleave', 'eventHover');
				self.uiBind(this.$text, 'click', 'eventButtonClick');
			}
		},
		eventButtonClick: function(ev, el){
			//防止新窗口异步事件被阻止，直接查找父模块send事件消息
			if(this.getConfig('openNewpage')){
				this.send(this.parent(), 'input' + util.ucFirst(ev.type),{
					'value': this.getValue(),
					'target': el
				});
			}else{
				this.fire('input' + util.ucFirst(ev.type),{
					'value': this.getValue(),
					'target': el
				});
			}

			// this.fire('input' + util.ucFirst(ev.type),{
			// 	'value': this.getValue(),
			// 	'target': el
			// });

			this.$input.trigger('click');
            return false;

		},
		eventHandler: function(evt, elm){
			var self = this;
			var c = self.getConfig();
			if( c.menu ) {
				var mod = self.get('dropMenu');
				if( mod ) {
					mod.destroy();
				}
				else {
					self.createAsync('dropMenu', '@base/common/menu.base', {
						'trigger': elm,
						'relate_elm': elm,
						'options': c.menu,
						'width': null
					});
				}
			}
			self.fire('input' + util.ucFirst(evt.type),{
				'value': self.getValue(),
				'target': elm
			});
		},
		eventHover: function(ev, dom){
			if(ev.type == 'mouseenter'){
				this.$text.show();
			}
			if(ev.type == 'mouseleave'){
				this.$text.hide();
			}

		},
		onMenuSelected: function( ev ) {
			var param = ev.param;
			this.fire( 'buttonAddMenuSelected', param[0].key );
			this.get('dropMenu').destroy();
		}
	});
	exports.add = Add;
});